using System;
using System.Collections.Generic;
using System.Text;
using EntidadesTO;
using System.Data;
using System.Data.SqlClient;

namespace AccesoDatos
{
    public class CuentaCorrienteDA
    {

        public List<CuentaCorrienteTO> BuscarCuentaCorriente_deuda(int pCodPersona, DateTime pFecha)
        {
            List<CuentaCorrienteTO> listaCuentaCorriente = new List<CuentaCorrienteTO>();
            SqlDataReader reader = null;
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {

                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_get_SEC_CuentaCorriente_vencido", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pCodPersona", pCodPersona);
                comando.Parameters.AddWithValue("@pFecha", pFecha);

                comando.CommandType = CommandType.StoredProcedure;

                reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    CuentaCorrienteTO cuentaCorrienteTO = new CuentaCorrienteTO();
                    cuentaCorrienteTO.Anho = Int32.Parse(reader.GetString(reader.GetOrdinal("anho")));
                    cuentaCorrienteTO.CodTrimestre = reader.GetInt32(reader.GetOrdinal("codTrimestre"));
                    cuentaCorrienteTO.Importe = reader.GetDecimal(reader.GetOrdinal("importe"));
                    cuentaCorrienteTO.FechaVencimiento = reader.GetDateTime(reader.GetOrdinal("fechaVencimiento"));
                    cuentaCorrienteTO.CodPersonaPaga = reader.GetInt32(reader.GetOrdinal("codPersonaPaga"));
                    cuentaCorrienteTO.CodTOperacion = reader.GetInt32(reader.GetOrdinal("codTOperacion"));
                    cuentaCorrienteTO.CodTImpuesto = reader.GetInt32(reader.GetOrdinal("codTImpuesto"));
                    cuentaCorrienteTO.NumComprobante = reader.GetInt32(reader.GetOrdinal("numComprobante"));
                    cuentaCorrienteTO.FeHoComprobante = reader.GetDateTime(reader.GetOrdinal("fehoComprobante"));
                    cuentaCorrienteTO.CodCuentaCorriente = reader.GetInt32(reader.GetOrdinal("codCuentaCorriente"));
                    cuentaCorrienteTO.CodPredio = reader.GetInt32(reader.GetOrdinal("codPredio"));
                    cuentaCorrienteTO.NumJurada = reader.GetInt32(reader.GetOrdinal("numJurada"));
                    cuentaCorrienteTO.DesTImpuesto = reader.GetString(reader.GetOrdinal("desTImpuesto"));

                    cuentaCorrienteTO.ObtenerPeriodo();

                    listaCuentaCorriente.Add(cuentaCorrienteTO);
                }

                reader.Close();
                instanciaConexion.CerrarConexion();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                listaCuentaCorriente = null;

            }
            finally
            {
                if (reader != null)
                {
                    if (reader.IsClosed == false)
                        reader.Close();
                }
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }

            return listaCuentaCorriente;

        }

        public List<CuentaCorrienteTO> BuscarCuentaCorriente_financiado_vencido(int pCodPersona, DateTime pFecha)
        {
            List<CuentaCorrienteTO> listaCuentaCorriente = new List<CuentaCorrienteTO>();
            SqlDataReader reader = null;
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {

                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_get_SEC_CuentaCorriente_financiado_vencido", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pCodPersona", pCodPersona);
                comando.Parameters.AddWithValue("@pFecha", pFecha);

                comando.CommandType = CommandType.StoredProcedure;

                reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    CuentaCorrienteTO cuentaCorrienteTO = new CuentaCorrienteTO();
                    cuentaCorrienteTO.Anho = Int32.Parse(reader.GetString(reader.GetOrdinal("anho")));
                    cuentaCorrienteTO.CodTrimestre = reader.GetInt32(reader.GetOrdinal("codTrimestre"));
                    cuentaCorrienteTO.Importe = reader.GetDecimal(reader.GetOrdinal("importe"));
                    cuentaCorrienteTO.FechaVencimiento = reader.GetDateTime(reader.GetOrdinal("fechaVencimiento"));
                    cuentaCorrienteTO.CodPersonaPaga = reader.GetInt32(reader.GetOrdinal("codPersonaPaga"));
                    cuentaCorrienteTO.CodTOperacion = reader.GetInt32(reader.GetOrdinal("codTOperacion"));
                    cuentaCorrienteTO.CodTImpuesto = reader.GetInt32(reader.GetOrdinal("codTImpuesto"));
                    cuentaCorrienteTO.NumComprobante = reader.GetInt32(reader.GetOrdinal("numComprobante"));
                    cuentaCorrienteTO.FeHoComprobante = reader.GetDateTime(reader.GetOrdinal("fehoComprobante"));
                    cuentaCorrienteTO.CodCuentaCorriente = reader.GetInt32(reader.GetOrdinal("codCuentaCorriente"));
                    cuentaCorrienteTO.CodPredio = reader.GetInt32(reader.GetOrdinal("codPredio"));
                    cuentaCorrienteTO.NumJurada = reader.GetInt32(reader.GetOrdinal("numJurada"));
                    cuentaCorrienteTO.DesTImpuesto = reader.GetString(reader.GetOrdinal("desTImpuesto"));

                    cuentaCorrienteTO.ObtenerPeriodo();

                    listaCuentaCorriente.Add(cuentaCorrienteTO);
                }

                reader.Close();
                instanciaConexion.CerrarConexion();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                listaCuentaCorriente = null;

            }
            finally
            {
                if (reader != null)
                {
                    if (reader.IsClosed == false)
                        reader.Close();
                }
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }

            return listaCuentaCorriente;

        }

        
        public void GuardarNuevo(CuentaCorrienteTO pCuentaCorriente)
        {
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {
                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_ins_SEC_CuentaCorriente", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pAnho", pCuentaCorriente.Anho);
                comando.Parameters.AddWithValue("@pCodTrimestre", pCuentaCorriente.CodTrimestre);
                comando.Parameters.AddWithValue("@pImporte", pCuentaCorriente.Importe);
                comando.Parameters.AddWithValue("@pFechaVencimiento", pCuentaCorriente.FechaVencimiento);
                comando.Parameters.AddWithValue("@pCodPersonaPaga", pCuentaCorriente.CodPersonaPaga);
                comando.Parameters.AddWithValue("@pCodTOperacion", pCuentaCorriente.CodTOperacion);
                comando.Parameters.AddWithValue("@pCodTImpuesto", pCuentaCorriente.CodTImpuesto);
                comando.Parameters.AddWithValue("@pFeHoComprobante", pCuentaCorriente.FeHoComprobante);
                comando.Parameters.AddWithValue("@pCodPredio", pCuentaCorriente.CodPredio);
                comando.Parameters.AddWithValue("@pNumJurada", pCuentaCorriente.NumJurada);

                comando.CommandType = CommandType.StoredProcedure;

                comando.ExecuteNonQuery();

                instanciaConexion.CerrarConexion();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }
            
        }

        public void ActualizarAbonos(InformacionAbonosTO infoTO)
        {
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {
                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_upd_SEC_CuentaCorriente_abonos", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pCodInformacionAbonos", infoTO.CodInformacionAbonos);
                comando.Parameters.AddWithValue("@pNumComprobante", infoTO.NumComprobante);
                comando.Parameters.AddWithValue("@pMonto", infoTO.Monto);
                comando.Parameters.AddWithValue("@pFecAbono", infoTO.FecAbono);
                
                comando.CommandType = CommandType.StoredProcedure;

                comando.ExecuteNonQuery();

                instanciaConexion.CerrarConexion();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }

        }

        public void FinanciarCuentaCorriente(int pNumComprobante, int pNumeroSolicitud, DateTime pFecha)
        {
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {
                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_upd_SEC_CuentaCorriente_financiamiento", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pNumComprobante", pNumComprobante);
                comando.Parameters.AddWithValue("@pNumeroSolicitud", pNumeroSolicitud);
                comando.Parameters.AddWithValue("@pFecha", pFecha);

                comando.CommandType = CommandType.StoredProcedure;

                comando.ExecuteNonQuery();

                instanciaConexion.CerrarConexion();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }

        }
    }
}
